/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package src.j2ee.compumake.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import src.j2ee.compumake.dominio.Interfaz;
import src.j2ee.compumake.dominio.Marca;
import src.j2ee.compumake.dominio.Producto;
import src.j2ee.compumake.dominio.Raton;
import src.j2ee.compumake.dominio.TarjetaMadre;
import src.j2ee.compumake.dominio.Teclado;

/************************************************************************
 **                                                                    **
 ** Nombre: DAORaton.java                                              **
 ** Version: v1.0.0                                                    **
 ** Autor: amado.cante                                                 **
 ** Creado: 24/04/2013                                                 **
 ** Modificado:                                                        **
 ** Diagrama:                                                          **
 ** Caso de uso:                                                       **
 **                                                                    **
 ***********************************************************************/
public class DAORaton {
    private static final String TABLA_RATONES = "Ratones";
    private static final String COLUMNA_ID_RATON = "idRaton";
    private static final String COLUMNA_MARCA = "marca";
    private static final String COLUMNA_NOMBRE = "nombre";
    private static final String COLUMNA_INTERFAZ = "interfaz";
    private DAOMarca daomarca;
    private DAOInterfaz daointerfaz;
    private Connection conexion;
    private AccesoBaseDatos acceso = new AccesoBaseDatos();
    
    public DAORaton(){
        this.conexion = this.acceso.abrirConexion();
    }
    
    public Raton insertaRaton(Raton raton){
        Raton r = null;
        try{
            String query = "INSERT INTO "+TABLA_RATONES+"("+COLUMNA_MARCA+","
                    +COLUMNA_NOMBRE+","+COLUMNA_INTERFAZ+") VALUES ('"+raton.getMarca().getClave()
                    +"','"+raton.getNombre()+"','"+raton.getInterfaz().getIdInterfaz()+"');";
            PreparedStatement sentencia = conexion.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
            int afectados = sentencia.executeUpdate();
            if(afectados==0){
                return null;
            }else{
                ResultSet generado = sentencia.getGeneratedKeys();
                if(generado.next()){
                    int id = generado.getInt(1);
                    r = raton;
                    r.setClave(id);
                    return r;
                }else{
                    return null;
                }
            }
        }
        catch (SQLException ex) {
            return r;
        }finally{
            acceso.cerrarConexion(conexion);
        }
    }
    
    public ArrayList<Raton> listarRatones(){
        ArrayList<Raton> ratones = new ArrayList<>();
        daointerfaz = new DAOInterfaz();
        daomarca = new DAOMarca();
        DAOProducto daoproducto = new DAOProducto();
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT * FROM "+TABLA_RATONES;
            ResultSet resultado = sentencia.executeQuery(query);
            while(resultado.next()){
                int idRaton = resultado.getInt(1);
                int idMarca = resultado.getInt(2);
                String nombre = resultado.getString(3);
                int idInterfaz = resultado.getInt(4);
                Marca m = daomarca.buscaMarca(idMarca);
                Interfaz i = daointerfaz.buscaInterfaz(idInterfaz);
                int existencia = daoproducto.obtenerExistenciaProducto(idRaton, (daoproducto.getTipos().get(Raton.class)).intValue());
                double precio = daoproducto.obtenerPrecioProducto(idRaton,(daoproducto.getTipos().get(Raton.class)).intValue());
                String ruta = daoproducto.obtenerRutaImagen(idRaton, (daoproducto.getTipos().get(Raton.class)).intValue());
                Raton raton = new Raton(i, idRaton, nombre, m, existencia, ruta, precio);
                ratones.add(raton);
            }
            return ratones;
        }catch(SQLException ex){
            return ratones;
        }finally{
            acceso.cerrarConexion(conexion);
        }
    }
    
    public Raton buscaRaton(int idRaton){
        try{
            Statement sentencia = acceso.crearSentenciaBD(conexion);
            String query = "SELECT * FROM "+TABLA_RATONES+" WHERE "+COLUMNA_ID_RATON+"='"+idRaton+"';";
            ResultSet resultado= sentencia.executeQuery(query);
            daointerfaz = new DAOInterfaz();
            daomarca = new DAOMarca();
            DAOProducto daoproducto = new DAOProducto();
            if(resultado.first()){
                int claveMarca = resultado.getInt(2);
                String nombre = resultado.getString(3);
                int idInterfaz = resultado.getInt(4);
                Marca m = daomarca.buscaMarca(claveMarca);
                Interfaz i = daointerfaz.buscaInterfaz(idInterfaz);
                int existencia = daoproducto.obtenerExistenciaProducto(idRaton, (daoproducto.getTipos().get(Raton.class)).intValue());
                double precio = daoproducto.obtenerPrecioProducto(idRaton,(daoproducto.getTipos().get(Raton.class)).intValue());
                String ruta = daoproducto.obtenerRutaImagen(idRaton, (daoproducto.getTipos().get(Raton.class)).intValue());
                Raton r = new Raton(i, idRaton, nombre, m, existencia, ruta, precio);
                acceso.cerrarConexion(conexion);
                return r;
            }else{
                return null;
            }
        }catch(SQLException ex){
            return null;
        }
    }
 
    public ArrayList<Producto> listarCompatibles(TarjetaMadre tarjetaMadre){
         ArrayList<Producto> ratones = new ArrayList<>();
         try{
             Statement sentencia = acceso.crearSentenciaBD(conexion);
             String query = "SELECT "+COLUMNA_ID_RATON+" FROM "+TABLA_RATONES
                     +" WHERE "+COLUMNA_INTERFAZ+" IN "+this.obtenerInterfacesTM(tarjetaMadre);
             ResultSet resultado = sentencia.executeQuery(query);
             while(resultado.next()){
                 int idRaton = resultado.getInt(1);
                 Raton raton = this.buscaRaton(idRaton);
                 if(raton!=null){
                     ratones.add(raton);
                 }
             }
             return ratones;
         }catch(SQLException ex){
             return ratones;
         }
    }
    
    private String obtenerInterfacesTM(TarjetaMadre tarjetaMadre){
        String interfaces="(";
        boolean seteado = false;
        if(tarjetaMadre.getPs2()>0){
            interfaces+="'4'";
            seteado = true;
        }
        if(tarjetaMadre.getUsbs()>0){
            if(seteado){
                interfaces+=",";
            }
            interfaces+="'3'";
        }
        interfaces+=")";
        return interfaces;
    }
}

